#include <sys/syscall.h>
#include <mips/regdef.h>

	.text
	.align 	2
	.global merge
	.ent 	merge

merge:
	.frame	$fp, 56, ra

	.set noreorder
	.cpload	t9
	.set reorder

	subu	sp,sp,56

	# Guardo los registros
	.cprestore 40
	sw		ra,48(sp)
	sw		$fp,44(sp)
	move	$fp,sp

	# Guardo los parametros
	sw		a0, 56($fp) // buffer left
	sw		a1, 60($fp) // buffer right
	sw		a2, 64($fp) // buffer resultado

	# length de left buffer:
	lw		a0, 56($fp)
	jal		length
	sw      v0, 16($fp)	// length buffer left
	
	# length de right buffer:
	lw		a0, 60($fp)
	jal		length
	sw      v0, 20($fp)	// length buffer right
	
	########################
	li		v0, SYS_write
	li		a0, 1
	la		a1, str_merge
	li		a2, 13
	syscall
	########################
	########################
	li		v0, SYS_write
	li		a0, 1
	lw		a1, 56($fp)
	lw		a2, 16($fp)
	syscall
	########################
	########################
	li		v0, SYS_write
	li		a0, 1
	la		a1, str_salto
	li		a2, 1
	syscall
	########################	
	########################
	li		v0, SYS_write
	li		a0, 1
	lw		a1, 60($fp)
	lw		a2, 20($fp)
	syscall
	########################
	########################
	li		v0, SYS_write
	li		a0, 1
	la		a1, str_salto
	li		a2, 1
	syscall
	########################	
	
	lw		t3,	56($fp)
	lw		t5,	60($fp)	
	lw		t0,	64($fp)
	
loop_condicion:
	lw		t1, 16($fp)	// length left
	lw		t2, 20($fp) // length right
	bgtz	t1, loop_cuerpo
	bgtz	t2, loop_cuerpo
	j		terminar
loop_cuerpo:
	# longitud de left o right es mayor a cero
	lw		t1, 16($fp)
	lw		t2, 20($fp)
	beqz	t1, if_left
	beqz	t2, if_left
	
	# si el primero izquierdo es menor o igual
	# al primero derecho
	lb		t4,	0(t3)	// primero left
	lb		t6,	0(t5)	// primero right
	bgt		t4, t6, else_1
	
	sb		t4,	0(t0)	// append primero left
	
	addiu	t3, t3, 1
	lw		t1, 16($fp)	// disminuyo el length left
	addi	t1, t1, -1
	sw		t1,	16($fp)
	j	fin_ifs

else_1:
	lb		t6,	0(t5)	// primero right
	sb		t6,	0(t0)	// append primero right

	addiu	t5, t5, 1
	lw		t2, 20($fp)	// disminuyo el length right
	addi	t2, t2, -1
	sw		t2, 20($fp)
	j	fin_ifs
	
if_left:
	# si longitud left es mayor a cero
	lw		t1, 16($fp)
	blez	t1, if_right

	lb		t4,	0(t3)
	sb		t4,	0(t0)	// append primero left
	addiu	t3, t3, 1
	addi	t1, t1, -1	// disminuyo el length left
	sw		t1, 16($fp)
	j	fin_ifs

if_right:
	# si longitud right es mayor a cero
	lw		t2,	20($fp)
	blez	t2, fin_ifs

	lb		t6,	0(t5)	// primero right
	sb		t6,	0(t0)	// append primero right
	addiu	t5, t5, 1
	addi	t2, t2, -1	// disminuyo el length right
	sw		t2, 20($fp)
	j	fin_ifs

fin_ifs:
	addiu	t0, t0, 1	// aumento indice resultado
	j	loop_condicion
	
terminar:
	########################
	li		v0, SYS_write
	li		a0, 1
	la		a1, str_resultado
	li		a2, 11
	syscall
	########################
	########################
	li		v0, SYS_write
	li		a0, 1
	lw		a1, 64($fp)
	li		a2, 6
	syscall
	########################
	########################
	li		v0, SYS_write
	li		a0, 1
	la		a1, str_salto
	li		a2, 1
	syscall
	########################	

terminar_merge:
	# destruyo el stack
	move	sp, $fp
	lw	$fp, 44(sp)
	lw	ra,  48(sp)
	addu	sp, sp, 56

	j	ra
	.end	merge
	
	.rdata
str_hola: .asciiz	"hola\n"
str_resultado: .asciiz	"\nresultado:"
str_salto: .asciiz	"\n"
str_finlinea: .asciiz	"\0"
str_merge: .asciiz	"\nmerge-input:"
